bitkeeper revision 1.1246 (423705104iQz7lnTkmHF1xmS_A1bNg)
authorrneugeba@wyvis.research.intel-research.net <rneugeba@wyvis.research.intel-research.net>
Tue, 15 Mar 2005 15:53:52 +0000 (15:53 +0000)
committerrneugeba@wyvis.research.intel-research.net <rneugeba@wyvis.research.intel-research.net>
Tue, 15 Mar 2005 15:53:52 +0000 (15:53 +0000)
Michael's hacked shadow mode linux

Signed-off-by: michael.fetterman@cl.cam.ac.uk
linux-2.6.10-xen-sparse/arch/xen/Kconfig
linux-2.6.10-xen-sparse/arch/xen/i386/mm/hypervisor.c
linux-2.6.10-xen-sparse/arch/xen/i386/mm/init.c
linux-2.6.10-xen-sparse/arch/xen/i386/mm/pgtable.c

index 47e508cdc12c80bc51fc9e67bf1acbdd65d62878..eab4ee6c7960210fb2d06670ebec221fb7b9d421 100644 (file)
@@ -146,6 +146,12 @@ config XEN_BATCH_MODE2
       we only use this for benchmarking
       enable only if you know what you are doing
 
+config XEN_SHADOW_MODE
+       bool "Fake shadow mode"
+       default n
+    help
+      fakes out a shadow mode kernel
+
 
 config XEN_SCRUB_PAGES
        bool "Scrub memory before freeing it to Xen"
index b9786ff8f458e48c506c32d621c57895acfa155f..7ade9e1ca6c4715b8b8b1e0f7c88e9ab65e46001 100644 (file)
@@ -125,6 +125,7 @@ static inline void increment_index_and_flush(void)
 
 void queue_l1_entry_update(pte_t *ptr, unsigned long val)
 {
+#ifndef CONFIG_XEN_SHADOW_MODE
     int cpu = smp_processor_id();
     int idx;
     unsigned long flags;
@@ -137,10 +138,15 @@ void queue_l1_entry_update(pte_t *ptr, unsigned long val)
     __flush_page_update_queue();
 #endif
     spin_unlock_irqrestore(&update_lock, flags);
+#else
+    _flush_page_update_queue();
+    *(unsigned long *)ptr = val;
+#endif
 }
 
 void queue_l2_entry_update(pmd_t *ptr, unsigned long val)
 {
+#ifndef CONFIG_XEN_SHADOW_MODE
     int cpu = smp_processor_id();
     int idx;
     unsigned long flags;
@@ -150,6 +156,10 @@ void queue_l2_entry_update(pmd_t *ptr, unsigned long val)
     per_cpu(update_queue[idx], cpu).val = val;
     increment_index();
     spin_unlock_irqrestore(&update_lock, flags);
+#else
+    _flush_page_update_queue();
+    *(unsigned long *)ptr = val;
+#endif
 }
 
 void queue_pt_switch(unsigned long ptr)
@@ -278,6 +288,7 @@ void queue_machphys_update(unsigned long mfn, unsigned long pfn)
 /* queue and flush versions of the above */
 void xen_l1_entry_update(pte_t *ptr, unsigned long val)
 {
+#ifndef CONFIG_XEN_SHADOW_MODE
     int cpu = smp_processor_id();
     int idx;
     unsigned long flags;
@@ -287,10 +298,14 @@ void xen_l1_entry_update(pte_t *ptr, unsigned long val)
     per_cpu(update_queue[idx], cpu).val = val;
     increment_index_and_flush();
     spin_unlock_irqrestore(&update_lock, flags);
+#else
+    *(unsigned long *)ptr = val;
+#endif
 }
 
 void xen_l2_entry_update(pmd_t *ptr, unsigned long val)
 {
+#ifndef CONFIG_XEN_SHADOW_MODE
     int cpu = smp_processor_id();
     int idx;
     unsigned long flags;
@@ -300,6 +315,9 @@ void xen_l2_entry_update(pmd_t *ptr, unsigned long val)
     per_cpu(update_queue[idx], cpu).val = val;
     increment_index_and_flush();
     spin_unlock_irqrestore(&update_lock, flags);
+#else
+    *(unsigned long *)ptr = val;
+#endif
 }
 
 void xen_pt_switch(unsigned long ptr)
index 08d4f0c0cec1c1bba0a2ba270d132778aebfd23a..130f71c622137f3ea6596433d14016942f29df8a 100644 (file)
@@ -77,7 +77,9 @@ static pte_t * __init one_page_table_init(pmd_t *pmd)
 {
        if (pmd_none(*pmd)) {
                pte_t *page_table = (pte_t *) alloc_bootmem_low_pages(PAGE_SIZE);
+#ifndef CONFIG_XEN_SHADOW_MODE
                make_page_readonly(page_table);
+#endif
                set_pmd(pmd, __pmd(__pa(page_table) | _PAGE_TABLE));
                if (page_table != pte_offset_kernel(pmd, 0))
                        BUG();  
@@ -349,7 +351,9 @@ static void __init pagetable_init (void)
         * it. We clean up by write-enabling and then freeing the old page dir.
         */
        memcpy(new_pgd, old_pgd, PTRS_PER_PGD_NO_HV*sizeof(pgd_t));
+#ifndef CONFIG_XEN_SHADOW_MODE
        make_page_readonly(new_pgd);
+#endif
        queue_pgd_pin(__pa(new_pgd));
        load_cr3(new_pgd);
        queue_pgd_unpin(__pa(old_pgd));
index 0d8f833bd954b8743bd984dba1c8cea35e7b6785..d03b5ceecde7c9dc419ece6f5daee88694c014de 100644 (file)
@@ -181,7 +181,9 @@ pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long address)
        pte_t *pte = (pte_t *)__get_free_page(GFP_KERNEL|__GFP_REPEAT);
        if (pte) {
                clear_page(pte);
+#ifndef CONFIG_XEN_SHADOW_MODE
                make_page_readonly(pte);
+#endif
                xen_flush_page_update_queue();
        }
        return pte;
@@ -194,7 +196,9 @@ void pte_ctor(void *pte, kmem_cache_t *cache, unsigned long unused)
        set_page_count(page, 1);
 
        clear_page(pte);
+#ifndef CONFIG_XEN_SHADOW_MODE
        make_page_readonly(pte);
+#endif
        queue_pte_pin(__pa(pte));
        flush_page_update_queue();
 }
@@ -304,7 +308,9 @@ void pgd_ctor(void *pgd, kmem_cache_t *cache, unsigned long unused)
        spin_unlock_irqrestore(&pgd_lock, flags);
        memset(pgd, 0, USER_PTRS_PER_PGD*sizeof(pgd_t));
  out:
+#ifndef CONFIG_XEN_SHADOW_MODE
        make_page_readonly(pgd);
+#endif
        queue_pgd_pin(__pa(pgd));
        flush_page_update_queue();
 }